#include<sw/redis++/redis.h>
#include<gflags/gflags.h>
#include<iostream>
#include<thread>
#include<vector>

namespace xchat
{
// redis 对 会话信息管理 登录信息管理 验证码信息管理
class RedisFactory
{
public:
    static std::shared_ptr<sw::redis::Redis> create(const std::string &host,
                int port, int db, bool keep_alive)
    {
        sw::redis::ConnectionOptions opts;
        opts.host = host;
        opts.port = port;
        opts.db = db;
        opts.keep_alive = keep_alive;
        auto res = std::make_shared<sw::redis::Redis>(opts);
        return res;
    }

};

class Session
{
public:
    using ptr = std::shared_ptr<Session>;
    Session(std::shared_ptr<sw::redis::Redis> redis_client)
        :_redis_client(redis_client)
    {

    }
    //添加会话
    void append(const std::string &ssid, const std::string &uid)
    {
        _redis_client->set(ssid, uid);
    }
    //移除会话
    void remove(const std::string &ssid)
    {
        _redis_client->del(ssid);
    }
    //获取当前会话的uid
    sw::redis::OptionalString uid(const std::string &ssid)
    {
        return _redis_client->get(ssid);
    }
private:
    std::shared_ptr<sw::redis::Redis> _redis_client;
};

class Status //登录状态
{
public:
    using ptr = std::shared_ptr<Status>;
    Status(std::shared_ptr<sw::redis::Redis> redis_client)
        :_redis_client(redis_client)
    {

    }
    //添加状态
    void append(const std::string &uid)
    {
        _redis_client->set(uid, "");
    }
    //移除状态
    void remove(const std::string &uid)
    {
        _redis_client->del(uid);
    }
    //是否存在当前状态
    bool exists(const std::string &uid)
    {
        return _redis_client->get(uid) ? true : false;
    }
private:
    std::shared_ptr<sw::redis::Redis> _redis_client;
};

class Codes //验证码
{
public:
    using ptr = std::shared_ptr<Codes>;
    Codes(std::shared_ptr<sw::redis::Redis> redis_client)
        :_redis_client(redis_client)
    {

    }
    //添加会话
    bool append(const std::string &cid, const std::string &code, std::chrono::milliseconds expire_time = std::chrono::milliseconds(60000))
    {
        return _redis_client->set(cid, code, expire_time);
    }
    //移除会话
    void remove(const std::string &cid)
    {
        _redis_client->del(cid);
    }
    //获取当前会话的uid
    sw::redis::OptionalString code(const std::string &cid)
    {
        return _redis_client->get(cid);
    }
private:
    std::shared_ptr<sw::redis::Redis> _redis_client;
};

}